;
'use strict';
/**
*
* Filmdepo pleer
*
*/
function FDPleer(video, type) {
var T = this;
/**
* Параметры плеера
*/
T.params = {
type: null, //тип плеера
fullscreen: null, //статус фуллскрина
volume: null, //громкость по-умолчанию (кнопка mute не влияет)
video: video, //текущее видео
video_id: null, //идентификатор видео
video_src: null, //source у видео
video_poster_src: null, //путь к постеру
video_params: null, //параметры видео
advert_params: null, //хмл с рекламы
current_time: null, //текущее время видео в секундах
advert_src: null, //source у рекламы
advert_playing: false, //проигрывается рекламный преролл
localstorage: null, //локальное хранилище - хранит звук
timecounter: null, //счетчик времени
// url_ad: '//rose.ixbt.com/vast_max.php',
// url_ad: 'http://ixbt.video/cgi-bin/banqs.cgi?place_id=2',
url_ad: '//rose.ixbt.com/vast_min.php', //хмл с рекламой
url_params: '//ixbt.video/cgi-bin/ajax.pl?option=webcast_info&id=' //получение данных по видео
};
/**
* Ноды, используемые в плеере
*/
T.nodes = {
outer: null, //общий контейнер - .fd-container
poster: null, //постер - .fd-poster
wrapper: null, //враппер плеера - .fd-wrapper
video_container: null, //контейнер видео - .fd-video
failcap: null, //заглушка при ошибках - .fd-failcap
ad_skip: null, //кнопка скипа рекламы - .fd-ad-skip
top_nav: null, //меню в дополнительном - .fd-top-nav
play_button: null, //большая кнопка плэй - .fd-icon-big-play
video_title: null, //заголовок видео - .fd-toptitle
afterlinks: null, //ссылки после просмотра видео - .fd-afterlinks
replay_after: null, //кнопка реплэя - .fd-replay_please
bottom_nav: null, //полоска снизу - .fd-bottom-nav
hover_timestamp: null //время при наведении на полосу - .fd-bottom-nav-seekbar--hovertime
};
/**
* Билдит дом-дерево
*/
T.build = {
controls: null, //построить контролы управления
data_advert: null, //получить и распарсить данные по рекламе
data_video: null, //получить и распарсить данные по видео
fail_cap: null, //заглушка при ошибке
wrapper: null //построить враппер у видео
};
/**
* Функции конвертации
*/
T.convert = {
clickToPercent_height: null, //высота клика относительно высоты контейнера - используется для громкости
clickToPercent_width: null, //тоже самое, но по ширине - полоса воспроизведения
hasClass: null, //есть класс у ноды или нет
isVisible: null, //виден ли элемент
numToPercent: null, //получить процент
percentToSec: null, //проценты в секунды
positionToPixels: null, //вернуть позицию элемента относительно body
removeClass: null, //удалить класс
set_innerText: null, //добавить текст в ноду
secToTime: null, //s -> mm:ss
timeToSec: null //mm:ss -> s
};
/**
* Функции обработки внутренних данных
*/
T.data = {
browserSupport: null, //поддержка браузером видео
fail: null, //эксепшен после фэйла в получении данных
get: null, //получить данные и вернуть в коллбэк
isEmbedded: null, //? вставка через iframe
isFullscreen: null, //? полноэкранный режим
isMobile: null, //? пользователь на телефоне/планшете
send_ad_event: null, //дернуть рекламу
storage: null //доступ к window.localStorage
};
/**
* Вешает хэндлеры
*/
T.handlers = {
add: null //повесить хэндлеры
};
/**
* Функции манипуляций с домом
*/
T.nodefunction = {
ad_skip: null, //скипнуть рекламу
afterlinks: null, //показать ссылки после просмотра видео
changeWrapperFullscreenClass: null, //изменить класс при фуллскрине у контейнера
hoverControls: null, //скрыть/показать контролы при ховере
title: null, //заголовок показать/скрыть
toggleFullscreen: null, //фуллскрин
toggleRealSize: null, //реальный размер
toggleSettings: null, //настройки (кнопка "дополнительно")
video: null, //видео - пауза/плэй
volume: null, //звук - гет/сет
volumeContainerVisibility: null //видимость контейнера со звуком
};
// TODO hasClass: "Добавить поддержку снятия display у цсс"
/**
* ПОЕХАЛИ:
*/
/** T.DATA */
/**
* Получить данные аяксом
* @param callback
* @param url
* @param type
* @param fail_type
*/
T.data.get = function (callback, path, type, fail_type) {
var isIE8 = window.XDomainRequest ? true : false;
var invocation = createCrossDomainRequest();
var url = path;
function createCrossDomainRequest(url, handler) {
var request;
if (isIE8) {
request = new window.XDomainRequest();
}
else {
request = new XMLHttpRequest();
}
return request;
}
function handler(evtXHR) {
if (invocation.readyState == 4)
{
if (invocation.status == 200) {
outputResult();
}
else {
console.log("Filmdepo Pleer: ответ не 200");
T.build.fail_cap('Что-то пошло не так. Перезагрузите страницу для просмотра');
}
}
}
function outputResult() {
var response = invocation.responseText;
if (callback) callback(response);
}
if (invocation) {
if(isIE8) {
invocation.onload = outputResult;
invocation.open("GET", url, true);
invocation.send();
}
else {
invocation.open('GET', url, true);
invocation.onreadystatechange = handler;
invocation.send();
}
}
else {
console.log("Filmdepo Pleer: Браузер не поддерживает XMLHttpRequest");
T.build.fail_cap('Что-то пошло не так. Перезагрузите страницу для просмотра');
}
};
/**
* Сохранить в локасторадже (уровень громкости)
*/
T.data.storage = {
get: function(key) {
return T.params.localstorage.getItem(key);
},
isExists: function(key) {
return !!T.params.localstorage.getItem(key);
},
set: function(key, value){
T.params.localstorage.setItem(key, value);
},
remove: function(key) {
delete T.params.localstorage.removeItem(key)
}
};
/**
* Дернуть урл по клику на рекламу
* @param type
*/
T.data.send_ad_event = function(type){
T.data.get('', T.params.advert_events[type], 'get', '');
};
/**
* Эксепшен после фэйла в получении данных
*/
T.data.fail = function (type) {
if (type === 'normal') {
alert('Произошла ошибка :(')
}
console.log('Filmdepo Pleer: Проблемы с отправкой ajax-запроса');
};
/**
* Подержка видео у пользователя
*/
T.data.browserSupport = function () {
var video_sources, video_status, i = 0, canplay = true;
video_status = !!document.createElement('video').canPlayType;
video_sources = T.params.video.querySelectorAll('source');
if (!video_status) return false;
[].forEach.call(video_sources, function(el) {
var type = el.getAttribute('type');
if (document.createElement('video').canPlayType(type).replace('/no/', '')) {
canplay = canplay || true;
}
});
return (video_status && canplay);
};
/**
* В полноэкранном режиме или нет
* @returns {boolean}
*/
T.data.isFullscreen = function () {
return !!(document.fullScreen || document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement || document.fullscreenElement);
};
/**
* Пользователь с мобильника или нет
* @returns {boolean}
*/
T.data.isMobile = function () {
var check = false;
(function (a) {
if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)))check = true
})(navigator.userAgent || navigator.vendor || window.opera);
return check;
};
/**
* Встроенное видео или нет
* @return {boolean}
*/
T.data.isEmbedded = function(){
return T.params.type === 'embedded' ? true : false;
};
/** T.CONVERT */
/**
* Кросс-браузерно - innerText
* @param elem
* @param val
*/
T.convert.set_innerText = function(elem, val){
if (typeof elem.textContent !== "undefined") {
elem.textContent = val;
} else {
elem.innerText = val;
}
};
/**
* Видимость элемента
* @param el
* @returns {boolean}
*/
T.convert.isVisible = function(el) {
return el.style.display !== 'none';
};
/**
* Удалить класс
* @param node
* @param classname
* @returns {string} - строка с классами без classname
*/
T.convert.removeClass = function (node, classname) {
var class_array, i;
class_array = node.className.split(' ');
for (i = 0; class_array.length > i; i++) {
if (class_array[i] === classname.toString()) {
class_array.splice(i, 1);
}
}
return class_array.join(' ');
};
/**
* Наличие класса
* @param element
* @param className
* @returns {boolean}
*/
T.convert.hasClass = function (element, className) {
return (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(" " + className + " ") > -1;
};
/**
* Время в секунды
* @param time - MM:SS
* @returns sec - секунды
*/
T.convert.timeToSec = function (time) {
var t = time.split(':');
if (t.length === 3) {
return ((t[0] * 3600) + (t[1] * 60) + (parseInt(t[2])));
} else if (t.length === 2) {
return ((t[0] * 60) + (parseInt(t[1])));
} else {
console.log('неправильный формат времени');
}
};
/**
* Секунды во время
* @param s - секунды
* @returns {*} - MM:SS
*/
T.convert.secToTime = function (s) {
var time, h, m;
time = parseInt(s);
// h = Math.floor(time / 3600);
// time -= h * 3600;
m = Math.floor(time / 60);
time -= m * 60;
// return (h < 10 ? '0' + h : h) + ":" + (m < 10 ? '0' + m : m) + ":" + (time < 10 ? '0' + time : time);
return (m < 10 ? '0' + m : m) + ":" + (time < 10 ? '0' + time : time);
};
/**
* Получить проценты от числа
* @param sec - секунды
* @param total - всего секунд
* @returns {*} - проценты
*/
T.convert.numToPercent = function (sec, total) {
return sec * 100 / total;
};
/***
* Получить ширину контейнера и вычислить в процентах место клика от общей ширины контейнера
* @param e
* @param t - this
* @returns {*} - проценты
*/
T.convert.clickToPercent_width = function (e, t) {
var cursor_position, element_width;
cursor_position = e.pageX - T.convert.positionToPixels(t).left;
element_width = t.offsetWidth;
return T.convert.numToPercent(cursor_position, element_width);
};
/***
* Получить ширину контейнера и вычислить в процентах место клика от общей высоты контейнера
* @param e
* @param t - this
* @returns {*} - проценты
*/
T.convert.clickToPercent_height = function(e, t){
var cursor_position, element_width;
cursor_position = e.pageY - T.convert.positionToPixels(t).top;
element_width = t.offsetHeight;
return T.convert.numToPercent(element_width - cursor_position, element_width);
};
/**
* Проценты в секунды
* @param percent - проценты
* @param total - всего секунд
* @returns {*} - секунды
*/
T.convert.percentToSec = function (percent, total) {
return total * percent / 100;
};
/**
* Вернуть позицию элемента относительно body
* @param el
* @returns {{top: number, left: number}}
*/
T.convert.positionToPixels = function (el) {
return {
top: el.getBoundingClientRect().top + (document.documentElement.scrollTop || document.body.scrollTop),
left: el.getBoundingClientRect().left
};
};
/** T.BUILD */
/**
* Построить обертку для видеоплеера
* @param video - видео
*/
T.build.wrapper = function (video, type) {
T.params.type = type;
T.params.video = video;
T.params.current_time = 0;
T.params.video_id = video.getAttribute('data-webcast');
T.params.video_poster_src = video.getAttribute('poster');
if(!T.params.video_poster_src || T.params.video_poster_src == '//ixbt.video/'){
T.params.video_poster_src = '//ixbt.video/resources/templates/1/img/indian-stand-by.jpg';
video.setAttribute('poster', T.params.video_poster_src);
}
T.params.video.setAttribute('webkit-playsinline', '');
T.params.video.setAttribute('preload', 'metadata');
T.params.localstorage = localStorage;
function posterVisibility() {
var t;
t = setInterval(function () {
if (poster_img.complete) {
T.nodes.outer.className += ' ready';
poster_img.style.visibility = 'visible';
T.nodes.poster.appendChild(poster_img);
T.nodes.outer.style.display = 'block';
T.nodes.poster.style.display = 'block';
T.params.video.style.display = 'block';
poster_img.removeEventListener('load', posterVisibility, false);
poster_img = null;
clearInterval(t);
}
}, 200);
}
var poster_img;
T.nodes.outer = document.createElement('div');
T.nodes.outer.setAttribute('class', 'fd-container');
T.nodes.wrapper = document.createElement('div');
T.nodes.wrapper.setAttribute('class', 'fd-wrapper');
T.nodes.wrapper.className += T.data.isMobile() ? ' mobile' : ' not-mobile';
T.nodes.wrapper.className += T.data.isEmbedded() ? ' embedded' : '';
T.nodes.video_container = document.createElement('div');
T.nodes.video_container.setAttribute('class', 'fd-video');
T.nodes.poster = document.createElement('div');
T.nodes.poster.setAttribute('class', 'fd-poster');
T.nodes.poster.style.display = 'none';
video.parentNode.insertBefore(T.nodes.video_container, video.nextSibling);
T.nodes.video_container.appendChild(video);
T.nodes.wrapper.appendChild(T.nodes.poster);
T.nodes.video_container.parentNode.insertBefore(T.nodes.wrapper, T.nodes.video_container);
T.nodes.wrapper.appendChild(T.nodes.video_container);
T.nodes.wrapper.parentNode.insertBefore(T.nodes.outer, T.nodes.wrapper);
T.nodes.outer.appendChild(T.nodes.wrapper);
poster_img = new Image();
poster_img.setAttribute('alt', '');
poster_img.src = T.params.video_poster_src;
poster_img.addEventListener('load', posterVisibility, false);
if (!T.data.browserSupport()) {
T.build.fail_cap('Ваш браузер не поддерживает воспроизведение видео');
return false;
}
T.data.get(T.build.data_advert, T.params.url_ad, 'get', 'normal');
};
/**
* Повесить заглушку с ошибкой
*/
T.build.fail_cap = function (text) {
T.nodes.failcap = document.createElement('div');
T.nodes.failcap.setAttribute('class', 'fd-failcap');
T.nodes.failcap.innerHTML = '' +
'' +
'
'+text+'
';
T.nodes.wrapper.appendChild(T.nodes.failcap);
return false;
};
/**
* Получить и распарсить данные по рекламе
* @param r
*/
T.build.data_advert = function (r) {
var parser, parseAdvertEvents, xml, video_sources, video_sources_string = '', i = 0;
parseAdvertEvents = function(el){
var obj, paramslist, i = 0;
obj = {};
paramslist = el.getElementsByTagName('TrackingEvents')[0].getElementsByTagName('Tracking');
while (paramslist.length > i) {
var t;
t = paramslist[i];
obj[t.getAttribute('event')] = t.childNodes[0].nodeValue;
i++;
}
obj['clickThrough'] = el.getElementsByTagName('VideoClicks')[0].getElementsByTagName('ClickThrough')[0].childNodes[0].nodeValue;
T.params.advert_events = obj;
};
video_sources = T.params.video.getElementsByTagName('source');
parser = new DOMParser();
xml = parser.parseFromString(r, 'text/xml');
while(video_sources.length > i) {
var t = video_sources[i];
video_sources_string += ' ';
i++;
}
T.params.advert_params = xml.getElementsByTagName('Ad')[0];
T.params.video_src = video_sources_string;
if (T.params.advert_params) {
var i = 0,
mf = T.params.advert_params.getElementsByTagName('MediaFile'),
mf_l = mf.length,
arr = []
;
while (mf_l > i) {
var str = '